﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;
using System.Collections;

using Noris.Schedule.Support;
using Noris.Schedule.Support.Services;
using Noris.Schedule.UI.Services;

namespace Noris.Schedule.UI.Components
{
	// Sada funkcí, které se objevují v menu po kliknutí pravé myši na ikonu Tree.Plus / Tree.Minus
	#region EXPAND ALL
	/// <summary>
	/// Funkce, která do kontextového menu na ikoně Tree.Plus/Tree.Minus přidá a obsluhuje položku "Otevřít vše"
	/// </summary>
	public class TreeNodeFunctionExpandAll : IFunctionMenuItem
	{
		/// <summary>
		/// Tady funkce deklaruje, pro které případy chce být vidět v nabídce.
		/// A pokud ano, tak jak se jmenuje, kde v nabídce je a jaký má obrázek.
		/// </summary>
		/// <param name="args"></param>
		/// <returns></returns>
		bool IFunctionMenuItem.IsFunctionSuitableFor(FunctionMenuItemSuitableArgs args)
		{
			// Element lze fixovat buď jako CapacityLink (pak jde o WorkUnit):
			bool isSuitable = (args.KeyAreaType == FunctionMenuItemAreaType.TreeIconExpand || args.KeyAreaType == FunctionMenuItemAreaType.TreeIconCollapse);
			if (isSuitable)
			{
				args.EnabledStateDependingOnElement = true;
				args.MenuCaption = "Otevřít vše";
				args.MenuToolTipText = "Otevře všechny položky";
				args.MenuGroup = "NODES";
				args.MenuOrder = -505;
			}
			return isSuitable;
		}
		/// <summary>
		/// Vizuální vrstva se ptá, zda tato položka menu je pro aktuální elementy enabled nebo disabled.
		/// </summary>
		/// <param name="args"></param>
		/// <returns></returns>
		bool IFunctionMenuItem.IsMenuItemEnabledFor(FunctionMenuItemRunArgs args)
		{
			return (args.AreaType == FunctionMenuItemAreaType.TreeIconExpand);
		}
		/// <summary>
		/// Vstupní metoda do výkonné části pluginu
		/// </summary>
		/// <param name="args"></param>
		void IFunctionMenuItem.Run(FunctionMenuItemRunArgs args)
		{
			args.ResultTreeNodeAction = GridTreeNodeActionType.ExpandAll;
		}
	}
	#endregion
	#region CLOSE ALL
	/// <summary>
	/// Funkce, která do kontextového menu na ikoně Tree.Plus/Tree.Minus přidá a obsluhuje položku "Zavřít vše"
	/// </summary>
	public class TreeNodeFunctionCloseAll : IFunctionMenuItem
	{
		/// <summary>
		/// Tady funkce deklaruje, pro které případy chce být vidět v nabídce.
		/// A pokud ano, tak jak se jmenuje, kde v nabídce je a jaký má obrázek.
		/// </summary>
		/// <param name="args"></param>
		/// <returns></returns>
		bool IFunctionMenuItem.IsFunctionSuitableFor(FunctionMenuItemSuitableArgs args)
		{
			// Element lze fixovat buď jako CapacityLink (pak jde o WorkUnit):
			bool isSuitable = (args.KeyAreaType == FunctionMenuItemAreaType.TreeIconExpand || args.KeyAreaType == FunctionMenuItemAreaType.TreeIconCollapse);
			if (isSuitable)
			{
				args.EnabledStateDependingOnElement = true;
				args.MenuCaption = "Zavřít vše";
				args.MenuToolTipText = "Zavře všechny položky";
				args.MenuGroup = "NODES";
				args.MenuOrder = -504;
			}
			return isSuitable;
		}
		/// <summary>
		/// Vizuální vrstva se ptá, zda tato položka menu je pro aktuální elementy enabled nebo disabled.
		/// </summary>
		/// <param name="args"></param>
		/// <returns></returns>
		bool IFunctionMenuItem.IsMenuItemEnabledFor(FunctionMenuItemRunArgs args)
		{
			return (args.AreaType == FunctionMenuItemAreaType.TreeIconCollapse);
		}
		/// <summary>
		/// Vstupní metoda do výkonné části pluginu
		/// </summary>
		/// <param name="args"></param>
		void IFunctionMenuItem.Run(FunctionMenuItemRunArgs args)
		{
			args.ResultTreeNodeAction = GridTreeNodeActionType.CollapseAll;
		}
	}
	#endregion
	#region CLOSE ALL BUT THIS
	/// <summary>
	/// Funkce, která do kontextového menu na ikoně Tree.Plus/Tree.Minus přidá a obsluhuje položku "Zavřít vše ostatní"
	/// </summary>
	public class TreeNodeFunctionCloseAllButThis : IFunctionMenuItem
	{
		/// <summary>
		/// Tady funkce deklaruje, pro které případy chce být vidět v nabídce.
		/// A pokud ano, tak jak se jmenuje, kde v nabídce je a jaký má obrázek.
		/// </summary>
		/// <param name="args"></param>
		/// <returns></returns>
		bool IFunctionMenuItem.IsFunctionSuitableFor(FunctionMenuItemSuitableArgs args)
		{
			// Element lze fixovat buď jako CapacityLink (pak jde o WorkUnit):
			bool isSuitable = (args.KeyAreaType == FunctionMenuItemAreaType.TreeIconExpand || args.KeyAreaType == FunctionMenuItemAreaType.TreeIconCollapse);
			if (isSuitable)
			{
				args.EnabledStateDependingOnElement = true;
				args.MenuCaption = "Zavřít vše ostatní";
				args.MenuToolTipText = "Zavře všechny položky kromě této";
				args.MenuGroup = "NODES";
				args.MenuOrder = -503;
			}
			return isSuitable;
		}
		/// <summary>
		/// Vizuální vrstva se ptá, zda tato položka menu je pro aktuální elementy enabled nebo disabled.
		/// </summary>
		/// <param name="args"></param>
		/// <returns></returns>
		bool IFunctionMenuItem.IsMenuItemEnabledFor(FunctionMenuItemRunArgs args)
		{
			return (args.AreaType == FunctionMenuItemAreaType.TreeIconCollapse);
		}
		/// <summary>
		/// Vstupní metoda do výkonné části pluginu
		/// </summary>
		/// <param name="args"></param>
		void IFunctionMenuItem.Run(FunctionMenuItemRunArgs args)
		{
			args.ResultTreeNodeAction = GridTreeNodeActionType.CollapseAllButThis;
		}
	}
	#endregion
}
